import { ElMessage } from "element-plus";
/* attr = [{type:"string",value:"武汉",name:"name"}] */
/**
 * @param {Array} position [114,30]
 * @param {Array} attr [{type:"string",value:"武汉",name:"name"}]
 * @param {Object} service ={name:"ig服务名称",layerId:"要素所在的图层"}
 * @param {Object} docLayer  地图文档的图层
 * @param {String} POINT_STYLE  点的颜色
 * @param {Number} FID 要修改的点的FID值
 *
 */
class Point {
  // 添加点
  static add({ position, attr, service, docLayer, POINT_STYLE }) {
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]); //createPoint();
    //设置当前点要素的几何信息
    var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] });
    // var point = new ol.Feature({
    //     geometry:new ol.geom.Point()
    // })
    /* 1-2、样式  图形参数信息 */
    var pointInfo = new Zondy.Object.CPointInfo(POINT_STYLE);
    //设置当前点要素的图形参数信息
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      /* 1-point  2--LineString  3--Area */
      InfoType: 1,
      PntInfo: pointInfo,
    });
    /* 1-3、属性 */
    var attValue = attr.map((item) => item.value);
    //创建一个要素
    var feature = new Zondy.Object.Feature({
      fGeom: fGeom,
      GraphicInfo: webGraphicInfo,
      AttValue: attValue,
    });
    //设置要素为点要素
    feature.setFType(1);
    /* 2、创建要素集 */
    //创建一个要素数据集
    var featureSet = new Zondy.Object.FeatureSet();
    //设置属性结构
    var cAttStruct = new Zondy.Object.CAttStruct({
      FldName: attr.map((item) => item.name),
      FldNumber: attr.length,
      FldType: attr.map((item) => item.type),
    });
    featureSet.AttStruct = cAttStruct;
    //添加要素到要素数据集
    featureSet.addFeature(feature);
    /* 3、调用服务添加要素 */
    /* 第一个参数 igserver服务的名称
          第二个参数 是添加要素所在的图层
         */
    var editService = new Zondy.Service.EditDocFeature(
      service.name,
      service.layerId,
      {}
    );
    //执行添加点要素功能
    editService.add(featureSet, this.onPntSuccess(docLayer));
  }
  // 添加点要素回调函数
  static onPntSuccess(docLayer) {
    return function (data) {
      if (data.succeed) {
        // alert("添加点要素成功！");
        ElMessage({
          message: "添加点要素成功！",
          type: "success",
        });
        docLayer.refresh();
      } else {
        // alert("添加点要素失败！");
        ElMessage.error("添加点要素失败！");
      }
    };
  }
  // 修改点
  static update({ FID, position, attr, service, docLayer, POINT_STYLE }) {
    //获取当前选择的要素编号FID
    var featureIds = FID;
    //创建一个点形状，描述点形状的几何信息
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]);
    var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] });
    // 设置添加点要素的图形参数信息
    var pointInfo = new Zondy.Object.CPointInfo(POINT_STYLE);
    //设置当前点要素的图形参数信息
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      InfoType: 1,
      PntInfo: pointInfo,
    });
    // 设置添加点要素的属性信息
    var attValue = attr.map((item) => item.value);
    //创建一个点要素
    var newFeature = new Zondy.Object.Feature({
      fGeom: fGeom,
      GraphicInfo: webGraphicInfo,
      AttValue: attValue,
    });
    //设置要素为点要素
    newFeature.setFType(1);
    newFeature.setFID(featureIds);
    //创建一个点要素数据集
    var featureSet = new Zondy.Object.FeatureSet();
    featureSet.clear();
    //设置属性结构
    var cAttStruct = new Zondy.Object.CAttStruct({
      FldName: attr.map((item) => item.name),
      FldNumber: attr.length,
      FldType: attr.map((item) => item.type),
    });
    featureSet.AttStruct = cAttStruct;
    //添加要素到要素数据集
    featureSet.addFeature(newFeature);
    //创建一个编辑服务类
    var editService = new Zondy.Service.EditDocFeature(
      service.name,
      service.layerId,
      {}
    );
    //执行修改点要素功能
    editService.update(featureSet, this.updatePntSuccess(docLayer));
  }
  //修改点要素回调函数
  static updatePntSuccess(docLayer) {
    return function (data) {
      if (data.succeed) {
        // alert("修改点要素成功！");
        ElMessage({
          message: "修改点要素成功！",
          type: "success",
        });
        docLayer.refresh();
      } else {
        // alert("修改点要素失败！");
        ElMessage.error("修改点要素成功！");
      }
    };
  }
  // 查询点
  static queryEvtPointByPosition({ position, service, success }) {
    var pointObj = new Zondy.Object.Point2D(position[0], position[1]);
    //设置查询点的搜索半径
    pointObj.nearDis = 0.001;
    /* 1、设置查询结构 */

    //初始化查询结构对象，设置查询结构包含几何信息
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    /* 2、设置查询规则 */
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true,
    });
    /* 3、设置查询参数 */
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      geometry: pointObj,
      resultFormat: "json",
      struct: queryStruct,
      rule: rule,
    });
    /* 4、调用查询服务 */
    //实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {}
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(success);
  }
}
export { Point };
